package com.fjl.utils;

import java.io.*;
import java.util.*;

public class LogTimeDifferenceByUUID {
    public static void main(String[] args) throws IOException {
        String pre="./log/all-2025-01-15.8";
        String logFile = pre+".log";  // 日志文件路径
        String outLogFile = pre+"1"+".log";  // 日志文件路径
        Map<String, List<Long>> uuidToCreateTimeMap = new HashMap<>(); // 用于存储每个 UUID 对应的多个入库结束时间（单位：毫秒）
        Set<String> processedUUIDs = new HashSet<>(); // 用于存储已经处理过的 UUID，避免重复输出
        BufferedWriter writer = new BufferedWriter(new FileWriter(outLogFile));
        try (BufferedReader reader = new BufferedReader(new FileReader(logFile))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 提取 uuid
                String uuid = extractUUID(line);

                // 如果是 createTask_start-入库结束，存储 uuid 和时间
                if (line.contains("createTask_start-入库结束") && uuid != null) {
                    long timeSpent = extractTimeSpent(line);  // 提取时间差（单位：毫秒）
                    uuidToCreateTimeMap
                            .computeIfAbsent(uuid, k -> new ArrayList<>())
                            .add(timeSpent);
                }

                // 如果是 createTask_sta，说明可能是另一种日志，不同格式的入库时间（同样累加）
//                if (line.contains("createTask_sta") && uuid != null) {
//                    long timeSpent = extractTimeSpent(line);  // 提取时间差（单位：毫秒）
//                    uuidToCreateTimeMap
//                            .computeIfAbsent(uuid, k -> new ArrayList<>())
//                            .add(timeSpent);
//                }

                // 如果是 Filter is processing the response，查找对应的 createTask 时间并计算差值
                if (line.contains("Filter is processing the response") && uuid != null) {
                    if (uuidToCreateTimeMap.containsKey(uuid) && !uuidToCreateTimeMap.get(uuid).isEmpty()) {
                        // 获取 uuid 对应的多个入库时间，累加它们
                        List<Long> createTimes = uuidToCreateTimeMap.get(uuid);
                        long sqlTotal = createTimes.stream().mapToLong(Long::longValue).sum(); // 累加所有入库时间

                        long filterTime = extractTimeSpent(line);  // 获取 Filter 处理的时间（单位：毫秒）
                        long timeDiff = filterTime - sqlTotal;

                        // 输出时间差（毫秒）
                        String s="UUID"+ uuid + " sqlTotal: " + sqlTotal + " ms,filterTime:"+filterTime+" filterTime-sqlTotal: " + timeDiff + " ms";
//                        System.out.println("UUID: " + uuid + " 入库总时间: " + totalCreateTime + " 毫秒, 总时间差: " + timeDiff + " 毫秒");
                        writer.write(s+"\n");
                        writer.flush();
                        // 只处理一次，避免重复计算
                        processedUUIDs.add(uuid);

                        // 移除已处理的所有入库时间
                        createTimes.clear();
                    }
                }
            }

            // 如果存在没有被 Filter 处理的 UUID，可以在这里输出或者做其他操作
            for (String uuid : uuidToCreateTimeMap.keySet()) {
                if (!processedUUIDs.contains(uuid)) {
                    List<Long> createTimes = uuidToCreateTimeMap.get(uuid);
                    long totalCreateTime = createTimes.stream().mapToLong(Long::longValue).sum();
                    System.out.println("UUID: " + uuid + " 入库总时间: " + totalCreateTime + " 毫秒, 总时间差: 未处理");
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 提取日志中的 UUID
    private static String extractUUID(String line) {
        String[] parts = line.split(" ");
        for (String part : parts) {
            if (part.startsWith("[") && part.endsWith("]")) {
                return part.substring(1, part.length() - 1);  // 去掉方括号，返回 uuid
            }
        }
        return null;
    }

    // 提取日志中的时间差（入库时间或请求结束时间）
    private static long extractTimeSpent(String line) {
        String timePart = line.split("time=")[1];
        if (timePart != null && timePart.endsWith("ms")) {
            return Long.parseLong(timePart.substring(0, timePart.length() - 2));  // 提取时间（去掉 ms 单位）
        }
        return 0;
    }
}
